// class Solution {
// public:
//     bool canJump(vector<int>& nums) {
//         vector<int> dp(2e5, 1e6);
//         dp[0] = 0;
//         for (int i = 0; i < nums.size() - 1; i++) {
//             if (dp[i] != 1e6 && i + nums[i] >= nums.size() - 1)
//                 return true;
//             for (int j = 1; j <= nums[i]; j++) {
//                 dp[i + j] = min(dp[i + j], dp[i] + 1);
//             }
//         }
//         return dp[nums.size() - 1] != 1e6 ? true : false;
//     }
// };

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int left = 0, right = 0;
        int ans = 0;
        while (right < nums.size() - 1) {
            int j = right;
            for (int i = left; i <= right; i++) {
                j = max(j, i + nums[i]);
            }
            if (j == right)
                return false;
            left = right + 1;
            right = j;
            ++ans;
        }
        return true;
    }
};